Skip to content

Generate non-ada UTxO in the fanout property tests - #2851

Open
vrom911 wants to merge 3 commits into
masterfrom
vrom911/partial-fanout-test-non-ada
Open

Generate non-ada UTxO in the fanout property tests#2851
vrom911 wants to merge 3 commits into
masterfrom
vrom911/partial-fanout-test-non-ada

Conversation

@vrom911

@vrom911 vrom911 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

The fanout generator only ever produced ada-only outputs, so the property tests never covered outputs carrying native tokens or datums. Parameterize genStOpen on the in-head UTxO generator and have genFanoutTx draw a mix of ada-only and arbitrary outputs.

Output value and datum size is what the on-chain accumulator hashing spends its budget on, so the arbitrary branch is capped: uncapped, a fanout of a few outputs each carrying ~100 assets overspends execution memory (14.3M against the 14M limit). Steps stay at ~82%, so memory is the binding constraint, and it scales with per-output size rather than output count - hence the cap on the size parameter, not the count


  • CHANGELOG updated or not needed
  • Documentation updated or not needed
  • Haddocks updated or not needed
  • No new TODOs introduced or explained herafter

@vrom911 vrom911 self-assigned this Aug 28, 2026
@github-actions

Copy link
Copy Markdown

Transaction cost differences

No cost or size differences found

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown

End-to-end benchmark differences

Comparing 1b1a07b (PR) against merge-base 099f5dd. Each runner measures both sides; every delta is the median over the same-machine pairs. Colored rows exceed the per-metric noise threshold with directional agreement (a calibrated heuristic, not a significance test); is within noise; uncolored rows are context. 🟢 = improvement, 🔴 = regression.

Round-trip latency (3 nodes, closed-loop, 3x250 txs)

Metric master PR Δ
End-to-end TPS (tx/s) 175.67 174.54 ≈ -0.2%
Sustained TPS, slope (tx/s) 179.14 176.05 ≈ -0.8%
Backlog drain time (s) 0.01 0.01 🔴 +27.9%
Snapshots per second (/s) 119.21 118.72 ≈ -0.3%
Avg txs per snapshot 1.47 1.47 ≈ -0.1%
Avg. Confirmation Time (s) 0.017 0.017 ≈ +0.4%
P50 confirmation (s) 0.016 0.017 ≈ +1.1%
P95 confirmation (s) 0.022 0.022 ≈ -1.0%
Tx validation time p50 (s) 0.005 0.005 ≈ +1.4%
Alloc MB per confirmed tx 4.15 4.17 ≈ +0.4%
Alloc MB per snapshot 6.11 6.13 ≈ +0.3%
Mutator CPU s per 1k txs 13.19 13.23 ≈ +0.3%
Max live MB (max node) 16.36 16.37 ≈ +0.0%
Peak node RSS (MB) 126.65 127.07 ≈ +0.3%
Invalid txs 0.00 0.00 ≈ +0.0

Sustained load (3 nodes, 3x5000 txs)

Metric master PR Δ
End-to-end TPS (tx/s) 460.94 454.00 ≈ -3.2%
Sustained TPS, slope (tx/s) 571.60 535.84 ≈ -4.2%
Backlog drain time (s) 32.10 32.46 ≈ +3.1%
Snapshots per second (/s) 0.51 0.51 ≈ -0.2%
Avg txs per snapshot 937.50 882.35 ≈ -2.9%
Tx validation time p50 (s) 5.662 5.002 ≈ -8.1%
Alloc MB per confirmed tx 3.95 4.05 ≈ +3.4%
Alloc MB per snapshot 3,677.90 3,574.29 ≈ +0.3%
Mutator CPU s per 1k txs 6.10 6.19 ≈ +3.3%
Max live MB (max node) 81.35 80.03 ≈ -1.6%
Peak node RSS (MB) 335.28 333.91 ≈ -1.2%
Invalid txs 0.00 0.00 ≈ +0.0

Plateau 1000 UTxO (1 node, 4000 txs)

Metric master PR Δ
End-to-end TPS (tx/s) 617.21 623.05 ≈ +4.1%
Sustained TPS, slope (tx/s) 623.39 598.99 ≈ -1.7%
Backlog drain time (s) 6.50 6.37 ≈ -3.9%
Snapshots per second (/s) 1.33 2.17 +97.4%
Avg txs per snapshot 535.71 333.33 -40.0%
Tx validation time p50 (s) 2.257 2.863 ≈ +13.6%
Alloc MB per confirmed tx 3.19 3.07 ≈ -4.5%
Alloc MB per snapshot 1,716.72 1,009.72 -42.2%
Mutator CPU s per 1k txs 1.97 1.99 ≈ +1.1%
Max live MB (max node) 26.25 20.16 🟢 -25.2%
Peak node RSS (MB) 162.05 153.15 ≈ -7.1%
Invalid txs 0.00 0.00 ≈ +0.0

  • bench-results-m1: Intel(R) Xeon(R) 6973P-C (4 vCPU, 16 GB)
  • bench-results-m2: AMD EPYC 7763 64-Core Processor (4 vCPU, 16 GB)
  • bench-results-m3: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz (4 vCPU, 16 GB)
  • bench-results-m4: AMD EPYC 9V74 80-Core Processor (4 vCPU, 16 GB)
  • Same-code spread across runners (End-to-end TPS), the noise an unpaired comparison would see:
    • Round-trip latency (3 nodes, closed-loop, 3x250 txs): branch 44.1%, master 32.6%
    • Sustained load (3 nodes, 3x5000 txs): branch 70.0%, master 70.1%
    • Plateau 1000 UTxO (1 node, 4000 txs): branch 43.4%, master 53.4%
Per-run raw values
Machine Slot Side Scenario E2E TPS Outcome
bench-results-m1 1 branch Round-trip latency (3 nodes, closed-loop, 3x250 txs) 231.65 ok
bench-results-m1 1 branch Sustained load (3 nodes, 3x5000 txs) 729.78 ok
bench-results-m1 1 branch Plateau 1000 UTxO (1 node, 4000 txs) 849.61 ok
bench-results-m1 2 master Round-trip latency (3 nodes, closed-loop, 3x250 txs) 214.03 ok
bench-results-m1 2 master Sustained load (3 nodes, 3x5000 txs) 757.59 ok
bench-results-m1 2 master Plateau 1000 UTxO (1 node, 4000 txs) 844.78 ok
bench-results-m2 1 master Round-trip latency (3 nodes, closed-loop, 3x250 txs) 166.38 ok
bench-results-m2 1 master Sustained load (3 nodes, 3x5000 txs) 445.45 ok
bench-results-m2 1 master Plateau 1000 UTxO (1 node, 4000 txs) 550.56 ok
bench-results-m2 2 branch Round-trip latency (3 nodes, closed-loop, 3x250 txs) 166.36 ok
bench-results-m2 2 branch Sustained load (3 nodes, 3x5000 txs) 429.28 ok
bench-results-m2 2 branch Plateau 1000 UTxO (1 node, 4000 txs) 592.68 ok
bench-results-m3 1 branch Round-trip latency (3 nodes, closed-loop, 3x250 txs) 182.71 ok
bench-results-m3 1 branch Sustained load (3 nodes, 3x5000 txs) 459.29 ok
bench-results-m3 1 branch Plateau 1000 UTxO (1 node, 4000 txs) 641.06 ok
bench-results-m3 2 master Round-trip latency (3 nodes, closed-loop, 3x250 txs) 184.96 ok
bench-results-m3 2 master Sustained load (3 nodes, 3x5000 txs) 472.25 ok
bench-results-m3 2 master Plateau 1000 UTxO (1 node, 4000 txs) 679.62 ok
bench-results-m4 1 master Round-trip latency (3 nodes, closed-loop, 3x250 txs) 161.42 ok
bench-results-m4 1 master Sustained load (3 nodes, 3x5000 txs) 449.63 ok
bench-results-m4 1 master Plateau 1000 UTxO (1 node, 4000 txs) 554.81 ok
bench-results-m4 2 branch Round-trip latency (3 nodes, closed-loop, 3x250 txs) 160.79 ok
bench-results-m4 2 branch Sustained load (3 nodes, 3x5000 txs) 448.71 ok
bench-results-m4 2 branch Plateau 1000 UTxO (1 node, 4000 txs) 605.05 ok

Workflow run

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Transaction costs

Transaction costs

Sizes and execution budgets for Hydra protocol transactions. Note that unlisted parameters are currently using arbitrary values and results are not fully deterministic and comparable to previous runs.

Metadata
Generated at 2026-09-02 20:10:54.948679891 UTC
Max. memory units 14000000
Max. CPU units 10000000000
Max. tx size (kB) 16384

Script summary

Name Hash Size (Bytes)
νHead 1d511733200df551c8cd8cddb3160ed39087af815638be37a1b80ffd 12962
μHead 603f261bc5a01f5f4ed988cc07a40a130b94e6820c28e9affde82d9e* 4971
νDeposit eafae2c32f99ab347c7bb15961e0e84c74305f9088c1a7b8abf88e7f 2117
νCRS 09db7ee6cf7a4b358dd5c8a2f19d2c048336ffc5a01ef35a47ca7072 2736
  • The minting policy hash is only usable for comparison. As the script is parameterized, the actual script is unique per head.

Init transaction costs

Parties Tx size % max Mem % max CPU Min fee ₳
1 5475 9.15 3.00 0.49
2 5572 10.33 3.41 0.51
3 5668 10.14 3.31 0.51
5 5861 11.52 3.77 0.53
10 6338 13.85 4.50 0.58
50 10182 35.18 11.18 0.97
100 14983 62.04 19.58 1.46
114 16330 69.86 22.05 1.60

Cost of Increment Transaction

Parties Tx size % max Mem % max CPU Min fee ₳
1 2822 20.96 7.51 0.70
2 2953 22.44 8.66 0.72
3 3084 23.02 9.50 0.74
5 3349 25.35 11.59 0.79
10 4003 30.22 16.47 0.89
50 9244 72.04 56.21 1.74
75 12518 97.53 80.82 2.27

Cost of Decrement Transaction

Parties Tx size % max Mem % max CPU Min fee ₳
1 641 18.52 6.70 0.58
2 773 19.46 7.66 0.60
3 904 20.45 8.64 0.62
5 1168 22.32 10.57 0.66
10 1822 27.09 15.42 0.76
50 7063 68.08 54.89 1.61
75 10338 93.66 79.54 2.13

Close transaction costs

Parties Tx size % max Mem % max CPU Min fee ₳
1 669 17.75 11.66 0.61
3 931 19.71 13.62 0.65
5 1194 21.68 15.58 0.69
10 1850 26.56 20.47 0.79
75 10362 92.99 84.71 2.17

Contest transaction costs

Parties Tx size % max Mem % max CPU Min fee ₳
1 690 21.47 14.90 0.66
2 831 22.65 15.94 0.68
3 960 23.74 16.95 0.71
5 1226 26.09 19.03 0.75
10 1876 31.69 24.14 0.86
50 7122 79.43 65.70 1.78
66 9214 98.85 82.42 2.15

FanOut transaction costs

Involves spending head output and burning head tokens. Uses ada-only UTXO for better comparability.
Rows first grow the UTxO set at a fixed 10 parties, then show the largest set that still fits per number of parties (burning more participation tokens leaves less room for outputs).

Parties UTxO UTxO (bytes) Tx size % max Mem % max CPU Min fee ₳
10 0 0 5644 23.70 43.00 1.14
10 1 57 5679 26.05 45.51 1.18
10 5 284 5813 36.28 55.83 1.34
10 10 569 5984 50.26 69.12 1.56
10 20 1139 6324 82.76 97.10 2.04
1 20 1137 6042 76.54 95.13 1.96
5 20 1138 6167 79.31 96.00 1.99
10 20 1140 6324 82.76 97.10 2.04
20 20 1139 6633 90.08 99.38 2.13
50 15 854 7394 95.05 92.01 2.15

PartialFanOut transaction costs

Largest chunk of ada-only outputs that can be distributed in one partial fanout step, computed dynamically. The last row is the maximum total UTxO count where at least one output can still be distributed.

Total UTxO Distributed UTxO (bytes) Tx size % max Mem % max CPU Min fee ₳
11 10 570 987 35.29 66.46 1.20
25 23 1309 1428 68.58 99.53 1.73
30 23 1309 1424 68.58 99.53 1.73
40 23 1309 1428 68.58 99.53 1.73
50 23 1311 1430 68.58 99.53 1.73
100 23 1309 1428 68.58 99.53 1.73
150 23 1308 1427 68.58 99.53 1.73
200 23 1306 1421 68.58 99.53 1.72
200 23 1310 1429 68.58 99.53 1.73

PartialFanOut transaction costs (with native tokens)

Largest chunk of native-token outputs that can be distributed in one partial fanout step, computed dynamically. The last row is the maximum total UTxO count where at least one output can still be distributed.

Total UTxO Distributed UTxO (bytes) Tx size % max Mem % max CPU Min fee ₳
11 10 1000 1477 42.27 68.94 1.29
25 21 2079 2324 76.69 99.20 1.83
30 21 2583 2848 76.71 99.35 1.85
40 21 2079 2324 76.71 99.20 1.83
50 21 2436 2699 76.69 99.30 1.84
100 21 1953 2193 76.71 99.20 1.82
150 21 2121 2369 76.69 99.20 1.83
200 21 2520 2783 76.71 99.35 1.85
200 21 2142 2391 76.69 99.24 1.83

FinalPartialFanOut transaction costs (with native tokens)

Terminal partial fanout step (FanoutProgress → Final) with outputs carrying a native token. Burns all head tokens and proves accumulator exhaustion via BLS proof.

Distributed UTxO (bytes) Tx size % max Mem % max CPU Min fee ₳
1 100 5520 22.51 44.43 1.14
5 495 5830 35.93 55.90 1.34
10 1230 6461 54.18 70.78 1.62
10 1220 6451 54.18 70.78 1.62
End-to-end benchmark results

End-to-end benchmark results

This page is intended to collect the latest end-to-end benchmark results produced by Hydra's continuous integration (CI) system from the latest master code.

Please note that these results are approximate as they are currently produced from limited cloud VMs and not controlled hardware. Rather than focusing on the absolute results, the emphasis should be on relative results, such as how the timings for a scenario evolve as the code changes.

Generated at 2026-09-02 20:11:27.008695407 UTC

Baseline Scenario

Number of nodes 1
Number of txs 300
Load mode open-loop
Avg. Confirmation Time (ms) 210.3
P99 214.9ms
P95 214.7ms
P50 211.6ms
Tx validation time p50 (ms) 122.5
End-to-end TPS 1392.93 tx/s
Backlog drain time (s) 0.2
Snapshots observed 2
Snapshots per second 9.29 /s
Avg txs per snapshot 150.0
Peak node RSS (MB) 129.3
Number of Invalid txs 0
Fanout outputs 2

Three local nodes

Number of nodes 3
Number of txs 900
Load mode open-loop
Avg. Confirmation Time (ms) 1015.7
P99 1028.8ms
P95 1027.3ms
P50 1022.8ms
Tx validation time p50 (ms) 502.0
End-to-end TPS 857.66 tx/s
Backlog drain time (s) 1.0
Snapshots observed 3
Snapshots per second 2.86 /s
Avg txs per snapshot 300.0
Peak node RSS (MB) 145.6
Number of Invalid txs 0
Fanout outputs 4
Scenario benchmark results

Scenario benchmark results

This page collects results from the scenario matrix: every combination of cluster size, UTxO shape, and incremental-ops mode is exercised by CI from the latest master code and reported below.

Numbers are approximate. They come from cloud VMs rather than controlled hardware, so the useful signal is the relative change between cells and between commits, not the absolute throughput.

Generated at 2026-09-02 20:23:25.011402595 UTC

Summary across cells

TPS columns are rates (transactions per second); Wall clock (s) is the measured elapsed time from the first tx submission to the last confirmation. Times are rounded to one decimal.

Scenario Txs Wall clock (s) End-to-end TPS (tx/s) Sustained TPS (tx/s) Avg conf (ms) P95 conf (ms)
Nodes=1, Constant, fire and forget 30 0.0 1038.10 n/a 28.0 28.6
Nodes=1, Constant, wait for tx valid 30 0.2 198.80 202.82 5.0 6.2
Nodes=1, Growing, fire and forget 30 0.0 819.52 n/a 35.8 36.4
Nodes=1, Growing, wait for tx valid 30 0.2 162.78 159.32 6.1 8.9
Nodes=1, Mixed, fire and forget 30 0.0 927.86 n/a 31.5 32.1
Nodes=1, Mixed, wait for tx valid 30 0.2 172.21 168.73 5.7 7.6
Nodes=2, Constant, fire and forget 60 0.1 839.80 n/a 69.0 70.5
Nodes=2, Constant, wait for tx valid 60 0.4 144.32 142.99 13.7 16.3
Nodes=2, Growing, fire and forget 60 0.1 757.72 n/a 77.4 78.4
Nodes=2, Growing, wait for tx valid 60 0.6 104.83 103.46 18.8 22.4
Nodes=2, Mixed, fire and forget 60 0.1 890.07 n/a 65.6 67.1
Nodes=2, Mixed, wait for tx valid 60 0.5 110.32 106.02 18.0 21.5
Nodes=3, Constant, fire and forget 90 0.1 611.29 n/a 143.8 146.2
Nodes=3, Constant, wait for tx valid 90 0.8 116.77 117.89 25.2 30.8
Nodes=3, Growing, fire and forget 90 0.2 592.37 n/a 147.6 150.5
Nodes=3, Growing, wait for tx valid 90 1.1 84.10 82.25 35.2 43.5
Nodes=3, Mixed, fire and forget 90 0.1 610.60 n/a 144.9 146.0
Nodes=3, Mixed, wait for tx valid 90 0.9 97.51 94.69 30.6 36.2

Nodes=1, Constant, fire and forget

Number of nodes 1
Number of txs 30
Load mode open-loop
Avg. Confirmation Time (ms) 28.0
P99 28.7ms
P95 28.6ms
P50 28.3ms
Tx validation time p50 (ms) 13.5
End-to-end TPS 1038.10 tx/s
Backlog drain time (s) 0.0
Snapshots observed 2
Snapshots per second 69.21 /s
Avg txs per snapshot 15.0
Peak node RSS (MB) 128.6
Number of Invalid txs 0
Fanout outputs 2

Nodes=1, Constant, wait for tx valid

Number of nodes 1
Number of txs 30
Load mode closed-loop
Avg. Confirmation Time (ms) 5.0
P99 7.0ms
P95 6.2ms
P50 4.8ms
Tx validation time p50 (ms) 1.7
End-to-end TPS 198.80 tx/s
Sustained TPS 202.82 tx/s
Backlog drain time (s) 0.0
Snapshots observed 30
Snapshots per second 198.80 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 129.0
Number of Invalid txs 0
Fanout outputs 2

Nodes=1, Growing, fire and forget

Number of nodes 1
Number of txs 30
Load mode open-loop
Avg. Confirmation Time (ms) 35.8
P99 36.4ms
P95 36.4ms
P50 36.1ms
Tx validation time p50 (ms) 14.3
End-to-end TPS 819.52 tx/s
Backlog drain time (s) 0.0
Snapshots observed 2
Snapshots per second 54.63 /s
Avg txs per snapshot 15.0
Peak node RSS (MB) 130.1
Number of Invalid txs 0
Fanout outputs 31

Nodes=1, Growing, wait for tx valid

Number of nodes 1
Number of txs 30
Load mode closed-loop
Avg. Confirmation Time (ms) 6.1
P99 10.5ms
P95 8.9ms
P50 5.7ms
Tx validation time p50 (ms) 1.6
End-to-end TPS 162.78 tx/s
Sustained TPS 159.32 tx/s
Backlog drain time (s) 0.0
Snapshots observed 30
Snapshots per second 162.78 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 143.3
Number of Invalid txs 0
Fanout outputs 31

Nodes=1, Mixed, fire and forget

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 1
Number of txs 30
Load mode open-loop
Avg. Confirmation Time (ms) 31.5
P99 32.1ms
P95 32.1ms
P50 31.7ms
Tx validation time p50 (ms) 10.9
End-to-end TPS 927.86 tx/s
Backlog drain time (s) 0.0
Snapshots observed 2
Snapshots per second 61.86 /s
Avg txs per snapshot 15.0
Peak node RSS (MB) 128.7
Number of Invalid txs 0
Fanout outputs 2

Nodes=1, Mixed, wait for tx valid

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 1
Number of txs 30
Load mode closed-loop
Avg. Confirmation Time (ms) 5.7
P99 7.7ms
P95 7.6ms
P50 5.4ms
Tx validation time p50 (ms) 1.7
End-to-end TPS 172.21 tx/s
Sustained TPS 168.73 tx/s
Backlog drain time (s) 0.0
Snapshots observed 30
Snapshots per second 172.21 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 141.9
Number of Invalid txs 0
Fanout outputs 2

Nodes=2, Constant, fire and forget

Number of nodes 2
Number of txs 60
Load mode open-loop
Avg. Confirmation Time (ms) 69.0
P99 70.9ms
P95 70.5ms
P50 69.5ms
Tx validation time p50 (ms) 24.9
End-to-end TPS 839.80 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 27.99 /s
Avg txs per snapshot 30.0
Peak node RSS (MB) 143.6
Number of Invalid txs 0
Fanout outputs 3

Nodes=2, Constant, wait for tx valid

Number of nodes 2
Number of txs 60
Load mode closed-loop
Avg. Confirmation Time (ms) 13.7
P99 17.9ms
P95 16.3ms
P50 13.6ms
Tx validation time p50 (ms) 3.6
End-to-end TPS 144.32 tx/s
Sustained TPS 142.99 tx/s
Backlog drain time (s) 0.0
Snapshots observed 60
Snapshots per second 144.32 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 143.2
Number of Invalid txs 0
Fanout outputs 3

Nodes=2, Growing, fire and forget

Number of nodes 2
Number of txs 60
Load mode open-loop
Avg. Confirmation Time (ms) 77.4
P99 78.5ms
P95 78.4ms
P50 77.9ms
Tx validation time p50 (ms) 25.7
End-to-end TPS 757.72 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 25.26 /s
Avg txs per snapshot 30.0
Peak node RSS (MB) 144.7
Number of Invalid txs 0
Fanout outputs 62

Nodes=2, Growing, wait for tx valid

Number of nodes 2
Number of txs 60
Load mode closed-loop
Avg. Confirmation Time (ms) 18.8
P99 25.1ms
P95 22.4ms
P50 19.1ms
Tx validation time p50 (ms) 5.6
End-to-end TPS 104.83 tx/s
Sustained TPS 103.46 tx/s
Backlog drain time (s) 0.0
Snapshots observed 60
Snapshots per second 104.83 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 134.8
Number of Invalid txs 0
Fanout outputs 62

Nodes=2, Mixed, fire and forget

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 2
Number of txs 60
Load mode open-loop
Avg. Confirmation Time (ms) 65.6
P99 67.2ms
P95 67.1ms
P50 66.1ms
Tx validation time p50 (ms) 23.9
End-to-end TPS 890.07 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 29.67 /s
Avg txs per snapshot 30.0
Peak node RSS (MB) 142.0
Number of Invalid txs 0
Fanout outputs 3

Nodes=2, Mixed, wait for tx valid

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 2
Number of txs 60
Load mode closed-loop
Avg. Confirmation Time (ms) 18.0
P99 24.2ms
P95 21.5ms
P50 18.2ms
Tx validation time p50 (ms) 6.2
End-to-end TPS 110.32 tx/s
Sustained TPS 106.02 tx/s
Backlog drain time (s) 0.0
Snapshots observed 60
Snapshots per second 110.32 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 144.5
Number of Invalid txs 0
Fanout outputs 3

Nodes=3, Constant, fire and forget

Number of nodes 3
Number of txs 90
Load mode open-loop
Avg. Confirmation Time (ms) 143.8
P99 146.3ms
P95 146.2ms
P50 145.1ms
Tx validation time p50 (ms) 46.0
End-to-end TPS 611.29 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 13.58 /s
Avg txs per snapshot 45.0
Peak node RSS (MB) 144.8
Number of Invalid txs 0
Fanout outputs 4

Nodes=3, Constant, wait for tx valid

Number of nodes 3
Number of txs 90
Load mode closed-loop
Avg. Confirmation Time (ms) 25.2
P99 33.3ms
P95 30.8ms
P50 24.8ms
Tx validation time p50 (ms) 6.7
End-to-end TPS 116.77 tx/s
Sustained TPS 117.89 tx/s
Backlog drain time (s) 0.0
Snapshots observed 61
Snapshots per second 79.15 /s
Avg txs per snapshot 1.5
Peak node RSS (MB) 145.0
Number of Invalid txs 0
Fanout outputs 4

Nodes=3, Growing, fire and forget

Number of nodes 3
Number of txs 90
Load mode open-loop
Avg. Confirmation Time (ms) 147.6
P99 150.7ms
P95 150.5ms
P50 149.6ms
Tx validation time p50 (ms) 68.2
End-to-end TPS 592.37 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 13.16 /s
Avg txs per snapshot 45.0
Peak node RSS (MB) 146.0
Number of Invalid txs 0
Fanout outputs 0

Nodes=3, Growing, wait for tx valid

Number of nodes 3
Number of txs 90
Load mode closed-loop
Avg. Confirmation Time (ms) 35.2
P99 49.5ms
P95 43.5ms
P50 34.8ms
Tx validation time p50 (ms) 10.9
End-to-end TPS 84.10 tx/s
Sustained TPS 82.25 tx/s
Backlog drain time (s) 0.0
Snapshots observed 61
Snapshots per second 57.00 /s
Avg txs per snapshot 1.5
Peak node RSS (MB) 146.2
Number of Invalid txs 0
Fanout outputs 0

Nodes=3, Mixed, fire and forget

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 3
Number of txs 90
Load mode open-loop
Avg. Confirmation Time (ms) 144.9
P99 146.2ms
P95 146.0ms
P50 145.6ms
Tx validation time p50 (ms) 45.5
End-to-end TPS 610.60 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 13.57 /s
Avg txs per snapshot 45.0
Peak node RSS (MB) 144.9
Number of Invalid txs 0
Fanout outputs 4

Nodes=3, Mixed, wait for tx valid

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 3
Number of txs 90
Load mode closed-loop
Avg. Confirmation Time (ms) 30.6
P99 40.6ms
P95 36.2ms
P50 30.2ms
Tx validation time p50 (ms) 8.1
End-to-end TPS 97.51 tx/s
Sustained TPS 94.69 tx/s
Backlog drain time (s) 0.0
Snapshots observed 60
Snapshots per second 65.00 /s
Avg txs per snapshot 1.5
Peak node RSS (MB) 144.5
Number of Invalid txs 0
Fanout outputs 4

@vrom911
vrom911 requested a review from a team September 1, 2026 14:06
The fanout generator only ever produced ada-only outputs, so the
property tests never covered outputs carrying native tokens or datums.
Parameterize genStOpen on the in-head UTxO generator and have
genFanoutTx draw a mix of ada-only and arbitrary outputs.

Output value and datum size is what the on-chain accumulator hashing
spends its budget on, so the arbitrary branch is capped: uncapped, a
fanout of a few outputs each carrying ~100 assets overspends execution
memory (14.3M against the 14M limit). Steps stay at ~82%, so memory is
the binding constraint, and it scales with per-output size rather than
output count - hence the cap on the size parameter, not the count
@vrom911
vrom911 force-pushed the vrom911/partial-fanout-test-non-ada branch from d0cb782 to 2299630 Compare September 2, 2026 08:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant